package gpschallenge.componentes.vehiculos;

import java.util.ArrayList;
import java.util.Iterator;

import gpschallenge.componentes.obstaculos.Afectable;
import gpschallenge.componentes.utililidades.Posicion;
import gpschallenge.componentes.utililidades.TipoDeVehiculo;
import gpschallenge.direccionamiento.Direccion;
import gpschallenge.mapa.Calle;
import gpschallenge.mapa.Esquina;
import gpschallenge.mapa.Mapa;

public class Vehiculo {
	private Posicion posicionAnterior=null;
	private Posicion posicionActual=null;
	private Mapa miMapa=null;
	private EstadoVehiculo estado = null;
	private int cantMovimientos = 0;
	private TipoDeVehiculo miTipoDeVehiculo = null;

	public Vehiculo() {
	};
	
	public void setMapa(Mapa unMapa){
		miMapa = unMapa;
	}

	public Vehiculo(EstadoVehiculo unEstado) {
		this.estado = unEstado;
	}

	public void setEstado(EstadoVehiculo unEstado) {
		this.estado = unEstado;
	}

	public void setTipoDeVehiculo(TipoDeVehiculo unTipo) {
		this.miTipoDeVehiculo = unTipo;
	}

	public EstadoVehiculo getEstado() {
		return this.estado;
	}

	public void reiniciarValoresACero() {
		this.cantMovimientos = 0;
	}

	public void sumarMovimientos(int valor) {
		cantMovimientos += valor;
	}

	public void restarMovimientos(int valor) {
		cantMovimientos -= valor;
	}

	public void sumarPorcentajeMovimientos(int valor) {
		int auxiliar = (cantMovimientos * valor) / 100;
		this.sumarMovimientos(auxiliar);
	}

	public void restarPorcentajeMovimientos(int valor) {
		int auxiliar = (cantMovimientos * valor) / 100;
		this.restarMovimientos(auxiliar);
	}

	public int getCantMovimientos() {
		return cantMovimientos;
	}

	public void setPosicionActual(Posicion nuevaPosicion){
		posicionAnterior = posicionActual;
		posicionActual = nuevaPosicion;
	}
	
	public Posicion getPosicionActual(){
		return posicionActual;
	}
	
	public Posicion getPosicionAnterior(){
		return posicionAnterior;
	}

	public void afectar(Afectable unAfectable) {
		estado.afectar(unAfectable, this);
	}

	public void afectar(ArrayList<Afectable> afectables) {

		Iterator<Afectable> it = afectables.iterator();
		while (it.hasNext()) {
			estado.afectar(it.next(), this);
		}
	}

	public TipoDeVehiculo getTipoVehiculo() {
		return miTipoDeVehiculo;
	}
	
	public void moverA(Direccion unaDireccion){
		int x = posicionActual.getX() + 2 * unaDireccion.obtenerPosicion().getX();
		int y = posicionActual.getY() + 2 * unaDireccion.obtenerPosicion().getY();
		this.setPosicionActual(new Posicion(x,y));
		Esquina unaEsquina = miMapa.getEsquina(posicionAnterior);
		Calle unaCalle = unaEsquina.getCalleEnDireccion(unaDireccion);
		if (unaCalle.getAfectables().isEmpty()) {
			sumarMovimientos(1);
		} else {
			this.afectar(unaCalle.getAfectables());
		}
	}

}
